package com.example.springboot.mybatisflex.tool;

import com.alibaba.fastjson.JSON;

import java.util.Optional;

/**
 * @author wwl
 * @version 1.0
 * @date 2024/9/10 11:30
 * @description:Optional类用法
 */
public class OptionalTool {
    public static void main(String[] args) {
/*       Optional.of(T t) : 创建一个 Optional 实例，t必须非空；
        Optional.empty() : 创建一个空的 Optional 实例
        Optional.ofNullable(T t)：t可以为null*/

        Optional<String> optional = Optional.of("Hello, World!");

        // 使用isPresent()方法判断Optional对象是否包含值
        if (optional.isPresent()) {
            // 使用get()方法获取Optional对象中的值
            String value = optional.get();
            System.out.println("Optional contains value: " + value);
        } else {
            System.out.println("Optional is empty.");
        }
        /**
         * T get(): 如果调用对象包含值，返回该值，否则抛异常
         *
         * T orElse(T other) ：如果有值则将其返回，否则返回指定的other对象。
         *
         * T orElseGet(Supplier<? extends T> other) ：如果有值则将其返回，否则返回由Supplier接口实现提供的对象。
         *
         * T orElseThrow(Supplier<? extends X> exceptionSupplier) ：如果有值则将其返回，否则抛出由Supplier接口实现提供的异常。
         */
        Optional<String> optional1 = Optional.empty();
        String name = optional1.orElse("World");
        System.out.println("name:"+name);
        String str =optional1.orElseGet(()->"test");
        System.out.println("str:"+str);
        /*try {
            String str1 =optional1.orElseThrow(()->new IllegalArgumentException("Optional is empty."));
            System.out.println("str:"+str1);
        } catch (IllegalArgumentException e) {
            throw new RuntimeException(e);
        }*/
       /* Optional<T> filter(Predicate<? super <T> predicate)：如果值存在，并且这个值匹配给定的 predicate，返回一个Optional用以描述这个值，否则返回一个空的Optional。*/
        Optional<String> optional2 = Optional.of("Hello");
        System.out.println(JSON.toJSONString(optional2));
        optional2.filter(s -> s.startsWith("H")).ifPresent(s -> System.out.println("String starts with 'H': " + s));


        /*<U>Optional<U> map(Function<? super T,? extends U> mapper)：如果有值，则对其执行调用映射函数得到返回值。如果返回值不为 null，则创建包含映射返回值的Optional作为map方法返回值，否则返回空Optional。*/
        Optional<String> optional3 = Optional.of("Hello");
        System.out.println("optional3: " + optional3.get());
        Optional<String> optional4= optional3.map(s -> {
            s.toLowerCase();
            return s;
        });
        System.out.println("optional4: " + optional4.get());
    }
}
